﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using JPSoftwareMVC.Filtro;
using JPSOFTWARE.BON.Modelos;
using JPSOFTWARE.BON.Regra;
using System.Globalization;
using Modelos;
using System.Net.Mail;

namespace JPSoftwareMVC.Controllers
{
    public class InicioController : Controller
    {
        public ActionResult Index()
        {

            ViewBag.Titulo = "BON - Distribuição de Bebidas.";

            return View();
        }

        public ActionResult Inicial()
        {
            ViewBag.Titulo = "BON - Distribuição de Bebidas.";

            RnDistribuidora rnEmpresa = new RnDistribuidora();
            List<DistribuidoraView> empresaView = new List<DistribuidoraView>();

            empresaView = rnEmpresa.ListarDistribuidoraView();

            CarregarDistribuidoras();
            CarregarEstados();

            return View(empresaView);
        }

		[HttpGet]
		public ActionResult Feedback()
		{
			ViewData["FeedbackUsuario"] = false;
			ViewData["FeedbackUsuarioErro"] = false;
			return View();	
		}

		[HttpPost]
		public ActionResult Feedback(FeedbackModel feedBackModel)
		{
			try
			{
				if (String.IsNullOrEmpty(feedBackModel.Nome) || String.IsNullOrEmpty(feedBackModel.Email) || String.IsNullOrEmpty(feedBackModel.Mensagem))
				{
					ViewData["FeedbackUsuarioErro"] = true;
					ViewData["FeedbackUsuario"] = false;
				}
				else
				{
					EnviarEmailFeedback(feedBackModel.Nome, feedBackModel.Email, feedBackModel.Mensagem, DateTime.Now);
					ViewData["FeedbackUsuario"] = true;
				}				

			}
			catch (Exception ex)
			{
				throw new Exception(ex.Message);
			}				
			return View();
		}

        [Authorize]
        [RegraAcesso(Roles = "Distribuidora")]
        public void CarregarDistribuidoras()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            UsuarioModel usuarioModel = Session["DadosUsuario"] as JPSOFTWARE.BON.Modelos.UsuarioModel;
            List<DistribuidoraView> distribuidoraCombo = rnDistribuidora.ListarDistribuidoraView();
            ViewData["DistribuidoraCombo"] = new SelectList(distribuidoraCombo, "IdDistribuidora", "NomeDistribuidora");
        }

        [Authorize]
        [RegraAcesso(Roles = "Distribuidora")]
        public void CarregarEstados()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<EstadosView> estadosView = rnDistribuidora.ListarEstados();
            ViewData["EstadosCombo"] = new SelectList(estadosView, "IdEstado", "Estado");
        }

        public JsonResult CarregarCidades(string estado)
        {
            string a = "Hello";
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<CidadeView> cidadeView = rnDistribuidora.ListarCidades(a);
            return Json(cidadeView, JsonRequestBehavior.AllowGet);
        }

        public ActionResult SessaoExpirou()
        {
            return View();
        }

        [HttpGet]
        public ActionResult Confirmacao(string url)
        {
            RnLogin rnLogin = new RnLogin();
            Retorno retorno = new Retorno();

            try
            {
                var hash = Request.QueryString["Confirme"].ToString().Trim();
                var email = Request.QueryString["Email"].ToString().Trim();

                bool sha256Checado = Hash.CheckHash(email, hash, Hash.HashType.SHA256);

                if (sha256Checado)
                {
                    retorno = rnLogin.VerificaConfirmacaoUsuario(email);
                    if (retorno.Sucesso)
                    {
                        ViewBag.Sucesso = true;
                        ViewBag.Mensagem = retorno.Mensagem;
                    }
                    else
                    {
                        ViewBag.Sucesso = false;
                        ViewBag.Mensagem = retorno.Mensagem;
                    }
                }
                else
                {
                    ViewBag.Erro = "Erro ao verificar autenticidade do cadastro. Entre em contato com o Bebida Social.";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return View();
        }

        [HttpGet]
        public ActionResult ListarDistribuidorasPartial()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<DistribuidoraView> empresaView = new List<DistribuidoraView>();

            empresaView = rnDistribuidora.ListarDistribuidoraView();

            return PartialView("ListaDistribuidoras_Partial", empresaView);
        }

        public ActionResult Locations()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<DistribuidoraView> lista = new List<DistribuidoraView>();
            List<DistribuidoraMapa> listaPreenchida = new List<DistribuidoraMapa>();

            lista = rnDistribuidora.ListarDistribuidoraView();

            foreach (var location in lista)
            {
                string descriptionHtml = "";
                descriptionHtml += string.Format("<b>{0}</b><br />", location.NomeDistribuidora);
                descriptionHtml += location.Endereco;
                descriptionHtml += string.Format("<br />{0}, {1} - {2}<br />", location.Cidade, location.Bairro, location.Estado);
                descriptionHtml += string.Format("<b>Telefone:</b> {0}<br /><b>Fax:</b> {1}", location.Telefone, location.Celular);

                listaPreenchida.Add(new DistribuidoraMapa
                {
                    NomeDistribuidora = location.NomeDistribuidora,
                    Descricao = descriptionHtml,
                    Endereco = location.Endereco,
                    Latitude = decimal.Parse(location.Latitude, CultureInfo.InvariantCulture),
                    Longitude = decimal.Parse(location.Longitude, CultureInfo.InvariantCulture),
                });
            }
            return Json(listaPreenchida);
        }

        //public ActionResult AdicionarProdutoCarrinho(int IdProduto)
        //{            
        //    RnProdutos rnProdutos = new RnProdutos();
        //    ProdutosView produto = new ProdutosView();

        //    produto = rnProdutos.ListarProduto(IdProduto);

        //    Session.Add("ProdutosCarrinho", produto);
        //    Session.Timeout = 60;

        //    return View();
        //}

        public String AdicionarItemCarrinho(int IdProduto)
        {
            RnProdutos rnProdutos = new RnProdutos();
            Retorno retorno = new Retorno();

            try
            {
                ProdutosView produtosView = rnProdutos.ListarProduto(IdProduto);

                if (produtosView != null)
                {
                    if (Session["carrinho"] == null)
                    {
                        Session["carrinho"] = new Carrinho();
                    }

                    // Pega o carrinho atual da Sessão
                    Carrinho _carrinho = (Carrinho)Session["carrinho"];
                    _carrinho.AdicionarItem(produtosView.IdProduto, produtosView.NomeProduto, decimal.Parse(produtosView.ValorUnitario, CultureInfo.InvariantCulture));

                    retorno = new Retorno { Mensagem = "Adicionado ao carrinho.", Objeto = _carrinho, Sucesso = true };
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retorno.Mensagem;
        }

        public ActionResult MostrarDistribuidoraNoMapa()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<DistribuidoraView> lista = new List<DistribuidoraView>();
            List<DistribuidoraMapa> listaPreenchida = new List<DistribuidoraMapa>();

            lista = rnDistribuidora.ListarDistribuidoraView();

            foreach (var location in lista)
            {
                string descriptionHtml = "";
                descriptionHtml += string.Format("<b>{0}</b><br />", location.NomeDistribuidora);
                descriptionHtml += location.Endereco;
                descriptionHtml += string.Format("<br />{0}, {1} - {2}<br />", location.Cidade, location.Bairro, location.Estado);
                descriptionHtml += string.Format("<b>Telefone:</b> {0}<br /><b>Fax:</b> {1}<br />", location.Telefone, location.Celular);
                //descriptionHtml += string.Format("<b><a href'javascript:VisualizarProdutosEmpresa('" + location.IdEmpresa + "')'>Vizualizar Produtos</a></b><br />");

                listaPreenchida.Add(new DistribuidoraMapa
                {                         
                    NomeDistribuidora = location.NomeDistribuidora,
                    Endereco = location.Endereco,
                    Descricao = descriptionHtml,
                    Latitude = decimal.Parse(location.Latitude, CultureInfo.InvariantCulture),
                    Longitude = decimal.Parse(location.Longitude, CultureInfo.InvariantCulture),
                    IdDistribuidora = location.IdDistribuidora,
                });
            }
            return Json(listaPreenchida);
        }

        public JsonResult VizualizarProdutoDistribuidora(int IdDistribuidora, int IdProduto)
        {
            var rnProdutos = new RnProdutos();

            Retorno retorno = rnProdutos.ListarProdutosInicial(IdDistribuidora, IdProduto);

            return Json(retorno, JsonRequestBehavior.AllowGet);
        }

        public JsonResult VizualizarProdutosDistribuidora(int id)
        {
            var rnProdutos = new RnProdutos();

            Retorno retorno = rnProdutos.ListarProdutosInicial(id);

            return Json(retorno, JsonRequestBehavior.AllowGet);
        }

        public IEnumerable<ProdutosView> ListarTodosProdutos()
        {
            var rnProdutos = new RnProdutos();
            return rnProdutos.ListarTodosProdutos();
        }

        public ActionResult ProdutoPorNome(string term)
        {
            var bebidas = (from p in ListarTodosProdutos()
                           where p.NomeProduto.ToLower().Contains(term.ToLower())
                           select new
                               {                
                                   label = p
                               }).ToArray();

            return Json(bebidas, JsonRequestBehavior.AllowGet);
        }

        public ActionResult BuscarProdutoPorId(string IdProduto)
        {
            try
            {
                RnProdutos rnProdutos = new RnProdutos();
                List<ProdutosView> produtoView = new List<ProdutosView>();

                if (!String.IsNullOrEmpty(IdProduto))                    
                {
                    produtoView = rnProdutos.BuscarProdutoPorId(int.Parse(IdProduto));                   
                }
                return Json(produtoView, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {                
                throw;
            }           
        }

        public IEnumerable<DistribuidoraView> ListaTodasDistribuidoras()
        {
            var rnDistribuidora = new RnDistribuidora();
            return rnDistribuidora.ListarDistribuidoraView();
        }

        public ActionResult DistribuidoraPorNome(string term)
        {
            var distribuidora = (from d in ListaTodasDistribuidoras()
                           where d.NomeDistribuidora.ToLower().Contains(term.ToLower())
                           select new
                           {
                               label = d
                           }).ToArray();

            return Json(distribuidora, JsonRequestBehavior.AllowGet);
        }

        public ActionResult BuscarDistribuidoraPorId(string IdDistribuidora)
        {
            try
            {
                RnDistribuidora rnDistribuidora = new RnDistribuidora();
                List<DistribuidoraView> distribuidoraView = new List<DistribuidoraView>();

                if (!String.IsNullOrEmpty(IdDistribuidora))
                {
                    distribuidoraView = rnDistribuidora.ListarDistribuidora(int.Parse(IdDistribuidora));
                }
                return Json(distribuidoraView, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                throw;
            }
        }

		private void EnviarEmailFeedback(string nome, string email, string mensagem, DateTime dataEnvio)
		{
			string _email = String.Empty;
			
			List<UsuarioView> usuarioView = new List<UsuarioView>();
			RnUsuario rnUsuario = new RnUsuario();						
			usuarioView = rnUsuario.ListarUsuariosAdministradorView();

			foreach (var item in usuarioView)
			{
				string emailAdministrador = item.Email;

				if (usuarioView.Count == 1)
				{
					_email = emailAdministrador;
				}
				else
				{
					_email = String.Concat(emailAdministrador, ";");
				}
			}

			try
			{
				string assunto = "Bebida Social - Feedback";
				mensagem = "<div>Olá Administrador do Bebida Social," +
					"<br>" +
					"<br>" +
					"Um usuário do Bebida Social enviou um feedback" +
				"<br>" +
				"<br>" +
				"<h3>Dados do Feedback</h3>" +
				"<br>" +
				"Nome: " + nome + "<br>" +
				"E-mail: " + email + "<br>" +
				"Mensagem: " + mensagem	+ "</br>" +
				"</div>";

				MailMessage mailMessage = new MailMessage("contato@bebidasocial.com.br", _email, assunto, mensagem);
				mailMessage.IsBodyHtml = true;
				SmtpClient emailClient = new SmtpClient("mail.bebidasocial.com.br", 25);
				System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("contato@bebidasocial.com.br", "XperiaX8");
				emailClient.UseDefaultCredentials = false;
				emailClient.Credentials = SMTPUserInfo;
				emailClient.Send(mailMessage);
			}
			catch (SmtpException smtpEx)
			{
				throw smtpEx;
			}
		}
    }
}
